package conservare.teste;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.apache.commons.lang.StringUtils;
import org.jrimum.bopepo.BancosSuportados;
import org.jrimum.bopepo.Boleto;
import org.jrimum.bopepo.view.BoletoViewer;
import org.jrimum.domkee.comum.pessoa.endereco.CEP;
import org.jrimum.domkee.comum.pessoa.endereco.Endereco;
import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa;
import org.jrimum.domkee.comum.pessoa.id.cprf.CNPJ;
import org.jrimum.domkee.financeiro.banco.Banco;
import org.jrimum.domkee.financeiro.banco.febraban.Agencia;
import org.jrimum.domkee.financeiro.banco.febraban.Carteira;
import org.jrimum.domkee.financeiro.banco.febraban.Cedente;
import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import org.jrimum.domkee.financeiro.banco.febraban.Modalidade;
import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta;
import org.jrimum.domkee.financeiro.banco.febraban.Sacado;
import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeMoeda;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite;
import org.jrimum.utilix.text.DateFormat;

import conservare.util.UtilitarioString;

public class BoletoCEFTeste {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
	           /*
                * INFORMANDO DADOS SOBRE O CEDENTE.
                */
               Cedente cedente = new Cedente("CONSERVARE CONSERV ADM DE CONDOMINIOS");
               cedente.setCPRF(new CNPJ("14.848.008/0001-17"));
               /*
                * INFORMANDO DADOS SOBRE O SACADO.
                */
               Sacado sacado = new Sacado("CONDOMINIO EDIFICIO HOLANDA");
               
               // Informando o endereço do sacado.
               Endereco enderecoSac = new Endereco();
               enderecoSac.setUF(UnidadeFederativa.MG);
               enderecoSac.setLocalidade("BELO HORIZONTE");
               enderecoSac.setCep(new CEP("30500-450"));
               enderecoSac.setBairro("CAMARGOS");
               enderecoSac.setLogradouro("R LUIZA EFIGENIA SILVA");
               enderecoSac.setNumero("379");
               enderecoSac.setComplemento("APTO 201");
               sacado.addEndereco(enderecoSac);
               /*
                * INFORMANDO DADOS SOBRE O SACADOR AVALISTA.
                */
               SacadorAvalista sacadorAvalista = new SacadorAvalista("CLAUDETE BASTOS COSTA", "494.841.096-91");

               // Informando o endereço do sacador avalista.
               Endereco enderecoSacAval = new Endereco();
               enderecoSacAval.setUF(UnidadeFederativa.MG);
               enderecoSacAval.setLocalidade("BELO HORIZONTE");
               enderecoSacAval.setCep(new CEP("30500-450"));
               enderecoSacAval.setBairro("CAMARGOS");
               enderecoSacAval.setLogradouro("R LUIZA EFIGENIA SILVA");
               enderecoSacAval.setNumero("379");
               enderecoSacAval.setComplemento("APTO 201");
               sacadorAvalista.addEndereco(enderecoSacAval);

               /*
                * INFORMANDO OS DADOS SOBRE O TÍTULO.
                */
               
               // Informando dados sobre a conta bancária do título.
               Banco banco = BancosSuportados.CAIXA_ECONOMICA_FEDERAL.create();
               
               ContaBancaria contaBancaria = new ContaBancaria(banco);
               NumeroDaConta numeroDaConta = new NumeroDaConta(314642,"1");
               Agencia agencia = new Agencia(893, "1");
               Carteira carteira = new Carteira(24, TipoDeCobranca.SEM_REGISTRO);
               Modalidade modalidade = new Modalidade(4);
               
               contaBancaria.setNumeroDaConta(numeroDaConta);            
               contaBancaria.setAgencia(agencia);
               contaBancaria.setCarteira(carteira);
               contaBancaria.setModalidade(modalidade); 
               
               cedente.addContaBancaria(contaBancaria);
               
               Titulo titulo = new Titulo(contaBancaria, sacado, cedente, sacadorAvalista);
               //StringUtils.leftPad("" + number, 7, "0");
               titulo.setNumeroDoDocumento(StringUtils.leftPad("1005", 11, "0"));
               titulo.setNossoNumero("954604442000999");
               String nossoNumeroCEF17Pos = "" + carteira.getCodigo() + titulo.getNossoNumero();
               String nossoNumeroDV = UtilitarioString.calculeDVModulo11(nossoNumeroCEF17Pos) + "";
               titulo.setDigitoDoNossoNumero(nossoNumeroDV);
       			
               titulo.setValor(BigDecimal.valueOf(722.50));
               Calendar cal = Calendar.getInstance();
               cal.set(2013, Calendar.JULY, 24);
               titulo.setDataDoDocumento(cal.getTime());
               titulo.setDataDoVencimento(DateFormat.DDMMYYYY_B.parse("18/08/2013"));
               titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL);
               titulo.setAceite(Aceite.N);
               titulo.setTipoDeMoeda(TipoDeMoeda.REAL);

               
               /*
                * INFORMANDO OS DADOS SOBRE O BOLETO.
                */
               
               //Boleto boleto = new Boleto(titulo, campoLivreCefSIGCB);
               Boleto boleto = new Boleto(titulo);
               
               boleto.setLocalPagamento("PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE");
               boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor cobrado não é o esperado, aproveite o DESCONTÃO!");
               boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!");
               boleto.setInstrucao2("MULTA DE R$: 14,45 APOS : 18/08/2013");
               boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre.");
               boleto.setInstrucao4("JUROS DE R$: 2,38 AO DIA");
               boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00");
               boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00");
               boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!");
               boleto.setInstrucao8("NÃO RECEBER APOS 30 DIAS DO VENCIMENTO");
               
               
               
               
               boleto.addTextosExtras("txtRsEspecieDocumento", titulo.getTipoDeDocumento().getSigla());
               
               
               
               /*
                * A área do boleto destinada a "Agência/Código do Cedente" deverá exibir a informação
                * "Agência (com 4 dígitos, zeros a esquerda)/Conta bancária". Ex: 0057/21109-2.
                */
               String agenciaCodigoDoCedenteParaExibicao = String.format("%04d/%d-%s",
					            		   		agencia.getCodigo(),
					            		   		contaBancaria.getNumeroDaConta().getCodigoDaConta(),
					            		   		contaBancaria.getNumeroDaConta().getDigitoDaConta());
               
               boleto.addTextosExtras("txtFcAgenciaCodigoCedente", agenciaCodigoDoCedenteParaExibicao); 
               boleto.addTextosExtras("txtRsAgenciaCodigoCedente", agenciaCodigoDoCedenteParaExibicao); 
               
               /*
                * A área do boleto destinada ao "Nosso Número" deverá exibir a informação
                * "Código da Carteira/Nosso Número". Ex: 109/1234567-8.
                */
               
               String nossoNumeroParaExibicao = String.format("%d/%s-%s", 
   		   										carteira.getCodigo(),
   		   										titulo.getNossoNumero(),
   		   										titulo.getDigitoDoNossoNumero()); 
               
               boleto.addTextosExtras("txtFcNossoNumero", nossoNumeroParaExibicao); 
               boleto.addTextosExtras("txtRsNossoNumero", nossoNumeroParaExibicao); 
               
               
               boleto.addTextosExtras("txtRsEspecie", "R$"); 
               boleto.addTextosExtras("txtFcEspecie", "R$"); 
               
               boleto.addTextosExtras("txtRsCarteira", "02");
               boleto.addTextosExtras("txtFcCarteira", "02");
               
               if(titulo.getAceite().equals(Aceite.N)){
            	   boleto.addTextosExtras("txtFcAceite", "NÃO");
               }
               
               
               
               boleto.addTextosExtras("txtRsDataProcessamento",new SimpleDateFormat("dd/MM/yyyy").format(titulo.getDataDoDocumento()));
               
               boleto.addTextosExtras("txtRsDataDocumento",new SimpleDateFormat("dd/MM/yyyy").format(titulo.getDataDoDocumento()));
               
               boleto.addTextosExtras("txtRsSacadoCpfCnpj", sacado.getCPRF() != null ? sacado.getCPRF().getCodigoFormatado() : "000.000.000-00");	
               
               String rsEndSacado = enderecoSac.getLogradouro() + " " + enderecoSac.getNumero();
               rsEndSacado += enderecoSac.getComplemento() != null ? " " + enderecoSac.getComplemento() : "";
               rsEndSacado += " - " + enderecoSac.getBairro() + " - " + enderecoSac.getLocalidade();
               
               boleto.addTextosExtras("txtRsSacadoEndereco", rsEndSacado);
               boleto.addTextosExtras("txtRsSacadoUf", enderecoSac.getUF().getSigla());
               boleto.addTextosExtras("txtRsSacadoCep", enderecoSac.getCEP().getCep());
               
               
               String fcEndSacado = enderecoSac.getLogradouro() + " " + enderecoSac.getNumero();
               fcEndSacado += enderecoSac.getComplemento() != null ? " " + enderecoSac.getComplemento() : "";
               fcEndSacado += " " + enderecoSac.getBairro();
               
               boleto.addTextosExtras("txtFcSacadoL1", sacado.getNome());
               boleto.addTextosExtras("txtFcSacadoL2", fcEndSacado);
               boleto.addTextosExtras("txtFcSacadoL3", enderecoSac.getLocalidade());
               boleto.addTextosExtras("txtFcSacadoCep", enderecoSac.getCEP().getCep());
               boleto.addTextosExtras("txtFcSacadoUf", enderecoSac.getUF().getSigla());
               boleto.addTextosExtras("txtFcSacadoCpfCnpj", sacado.getCPRF() != null ? sacado.getCPRF().getCodigoFormatado() : "000.000.000-00");
               
               
               
               boleto.addTextosExtras("txtRsSacadoAvalistaL1", sacadorAvalista.getNome());
               boleto.addTextosExtras("txtRsSacadoAvalistaCpfCnpj", sacadorAvalista.getCPRF().getCodigoFormatado());
               
               boleto.addTextosExtras("txtFcSacadoAvalistaL1", sacadorAvalista.getNome());
               boleto.addTextosExtras("txtFcSacadoAvalistaCpfCnpj", sacadorAvalista.getCPRF().getCodigoFormatado());
               
               DecimalFormat df = new DecimalFormat("#,###,##0.00");
               boleto.addTextosExtras("txtRsValorDocumento", df.format(titulo.getValor().doubleValue()));
               boleto.addTextosExtras("txtFcValorDocumento", df.format(titulo.getValor().doubleValue()));
               
               
               boleto.addTextosExtras("txtFcCpfCnpj", cedente.getCPRF().getCodigoFormatado());
               /*
                * GERANDO O BOLETO BANCÁRIO.
                * BoletoViewer boletoViewer = new BoletoViewer(boleto);
				* boletoViewer.setTemplate("/home/usuario/BoletoTemplatePersonalizacaoSimples.pdf");
                */
               //BoletoViewer boletoViewer = new BoletoViewer(boleto, "C:\\Apps\\workspace2\\ConservareWeb\\BoletoTemplateSemSacadorAvalista.pdf");
              
               //HttpServletResponse response = (HttpServletResponse) getExternalContext().getResponse();
               BoletoViewer boletoViewer = new BoletoViewer(boleto, "C:\\Apps\\workspace2\\ConservareWeb\\templateCEFNovo.pdf");
               //boletoViewer.getPdfAsByteArray();
               //boletoViewer.getPdfAsFile("MeuPrimeiroBoleto.pdf");
               //File arquivoPdf = boletoViewer.getPdfAsFile("MeuBoletoPersonalizado.pdf");
               
               File arquivoPdf = boletoViewer.getPdfAsFile("MeuBoletoPersonalizado.pdf");
               //templateCEFNovo.pdf
               // Mostrando o boleto gerado na tela.
               mostreBoletoNaTela(arquivoPdf);
               
               
       }

       /**
        * Exibe o arquivo na tela.
        * 
        * @param arquivoBoleto
        */
       private static void mostreBoletoNaTela(File arquivoBoleto) {

               java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
               
               try {
                       desktop.open(arquivoBoleto);
               } catch (IOException e) {
                       e.printStackTrace();
               }
       }
}
